//产生一个以微秒为周期的时钟信号clk_us，该信号可用于驱动一些需要精确时间控制的电路
module 	clk_div(
	input wire Clk				, // 输入系统时钟，50MHz
    input wire Rst_n			, // 输入复位信号，低电平有效
    
    output wire clk_us      // 输出微秒级时钟信号
);

	// 参数声明 1us = 1000ns = 50个时钟周期
	parameter CNT_MAX = 19'd50		;	//1us的计数值为 50 * Tclk（20ns）

	// 内部线网/寄存器声明
	reg [18:0] cnt					;   // 定义一个19位的计数器
	wire add_cnt					;   // 计数器使能信号
	wire end_cnt					;   // 计数器结束信号，达到最大值时有效
	

	// 计数器的寄存器逻辑	
	always @(posedge Clk or negedge Rst_n)begin  
		if(!Rst_n)begin  // 如果复位信号有效，则计数器清零
			cnt <= 'd0; 
		end  
		else if(add_cnt)begin   // 如果计数器达到最大值，则计数器重置
			if(end_cnt)begin  
				cnt <= 'd0; 
			end  
			else begin   // 否则计数器继续计数
				cnt <= cnt + 1'b1; 
			end  
		end  
		else begin  
			cnt <= cnt;  // 如果计数器未使能，则保持当前值
		end  
	end 
	
	// 赋值计数器使能信号，始终使计数器有效
	assign add_cnt = 1'b1; 
	// 赋值计数器结束信号，当计数器使能并且计数值达到CNT_MAX - 1时有效
	assign end_cnt = add_cnt && cnt >= CNT_MAX - 19'd1;
	// 赋值输出时钟信号，当计数器达到最大值时输出一个脉冲
	assign clk_us = end_cnt;
	

endmodule 

